package com.cloud.bssp.reference;

import java.lang.ref.SoftReference;

/**
 * @description： 软引用
 * ·软引用是用来描述一些还有用，但非必须的对象。只被软引用关联着的对象，在系统将要发生内
 * 存溢出异常前，会把这些对象列进回收范围之中进行第二次回收，如果这次回收还没有足够的内存，
 * 才会抛出内存溢出异常。在JDK 1.2版之后提供了SoftReference类来实现软引用。
 *
 * 应用场景：缓存
 *
 * 他强任他强
 * 缓存软引挤一旁
 * @author：weirx
 * @date：2021/5/19 16:39
 * @version：3.0
 */
public class SoftReferenceTest {

    public static void main(String[] args) throws InterruptedException {
        SoftReference<byte[]> m = new SoftReference(new byte[1024 * 1024 * 10]);

        System.out.println(m.get());

        //第一次垃圾回收
        System.gc();
        Thread.sleep(1000);
        System.out.println(m.get());

        //分配一个强引用的byte，看看当堆空间不足时，是否会将软引用回收。
        // 需要启动时将最大堆内存设置为25M，当内存不足后发生第二次垃圾回收之后在获取软引用就是null。
        byte[] bytes = new byte[1024 * 1024 * 12];
        System.out.println(m.get());
    }
}
